/*
 * Copyright (C) 2023 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { LogUtil } from '../../LogUtil'

// 构造单例对象
export class GlobalContext {
  private constructor() {
  }

  private static instance: GlobalContext;
  private _objects = new Map<string, Object | null>();

  public static getContext(): GlobalContext {
    LogUtil.debug("enter getContext");
    try {
      if (!GlobalContext.instance) {
        GlobalContext.instance = new GlobalContext();
      }
      return GlobalContext.instance;
    } catch (e) {
      LogUtil.error("getContext failed! err is %{public}s", JSON.stringify(e))
      throw (e as Error)
    } finally {
      LogUtil.debug("leave getContext")
    }
  }

  getObject(value: string): Object | null {
    LogUtil.debug("enter getObject, key=%{public}s", value);
    try {
      return this._objects.get(value);
    } catch (e) {
      LogUtil.error("getObject failed! key=%{public}s, err is %{public}s", value, JSON.stringify(e))
      throw (e as Error)
    } finally {
      LogUtil.debug("leave getObject");
    }
  }

  setObject(key: string, objectClass: Object | null): void {
    LogUtil.debug("enter setObject, key=%{public}s", key);
    try {
      this._objects.set(key, objectClass);
      LogUtil.info("setObject success, key=%{public}s", key);
    } catch (e) {
      LogUtil.error("setObject failed! key=%{public}s, err is %{public}s", key, JSON.stringify(e))
      throw (e as Error)
    } finally {
      LogUtil.debug("leave setObject");
    }
  }
}